#ifndef __WHIMSY_PROPERTY_HPP__SHANHAOBO_19800429__
#define __WHIMSY_PROPERTY_HPP__SHANHAOBO_19800429__

#include "./WhimsyPropertyBase.hpp"

namespace Whms
{
    namespace Property
    {
        //////////////////////////////////////////////////////////////////////////
        //////////////////////////////////////////////////////////////////////////
        //////////////////////////////////////////////////////////////////////////

        namespace Int8
        {
            typedef ::Whms::Property::Base::Int8::Type Type;
            WIZ_DECLARE(::Whms::Property::Int8::Type);
        } /// end of namespace Int8

        namespace Int16
        {
            typedef ::Whms::Property::Base::Int16::Type Type;
            WIZ_DECLARE(::Whms::Property::Int16::Type);
        } /// end of namespace Int16

        namespace Int32
        {
            typedef ::Whms::Property::Base::Int32::Type Type;
            WIZ_DECLARE(::Whms::Property::Int32::Type);
        } /// end of namespace Int32

        namespace Int64
        {
            typedef ::Whms::Property::Base::Int64::Type Type;
            WIZ_DECLARE(::Whms::Property::Int64::Type);
        } /// end of namespace Int64

        //////////////////////////////////////////////////////////////////////////
        //////////////////////////////////////////////////////////////////////////
        //////////////////////////////////////////////////////////////////////////

        namespace UInt8
        {
            typedef ::Whms::Property::Base::UInt8::Type Type;
            WIZ_DECLARE(::Whms::Property::UInt8::Type);
        } /// end of namespace UInt8

        namespace UInt16
        {
            typedef ::Whms::Property::Base::UInt16::Type Type;
            WIZ_DECLARE(::Whms::Property::UInt16::Type);
        } /// end of namespace UInt16

        namespace UInt32
        {
            typedef ::Whms::Property::Base::UInt32::Type Type;
            WIZ_DECLARE(::Whms::Property::UInt32::Type);
        } /// end of namespace UInt32

        namespace UInt64
        {
            typedef ::Whms::Property::Base::UInt64::Type Type;
            WIZ_DECLARE(::Whms::Property::UInt64::Type);
        } /// end of namespace UInt64

        //////////////////////////////////////////////////////////////////////////
        //////////////////////////////////////////////////////////////////////////
        //////////////////////////////////////////////////////////////////////////

        namespace Real32
        {
            typedef ::Whms::Property::Base::Real32::Type Type;
            WIZ_DECLARE(::Whms::Property::Real32::Type);
        } /// end of namespace Real32

        namespace Real64
        {
            typedef ::Whms::Property::Base::Real64::Type Type;
            WIZ_DECLARE(::Whms::Property::Real64::Type);
        } /// end of namespace Real64

        //////////////////////////////////////////////////////////////////////////
        //////////////////////////////////////////////////////////////////////////
        //////////////////////////////////////////////////////////////////////////

        namespace Vec2
        {
            typedef ::Whms::Property::Base::Vec2::Type Type;
            WIZ_DECLARE(::Whms::Property::Vec2::Type);
        } /// end of namespace Vec2

        namespace Vec3
        {
            typedef ::Whms::Property::Base::Vec3::Type Type;
            WIZ_DECLARE(::Whms::Property::Vec3::Type);
        } /// end of namespace Vec3

        namespace Vec4
        {
            typedef ::Whms::Property::Base::Vec4::Type Type;
            WIZ_DECLARE(::Whms::Property::Vec4::Type);
        } /// end of namespace Vec4

        //////////////////////////////////////////////////////////////////////////
        //////////////////////////////////////////////////////////////////////////
        //////////////////////////////////////////////////////////////////////////

        namespace IntVec2
        {
            typedef ::Whms::Property::Base::IntVec2::Type Type;
            WIZ_DECLARE(::Whms::Property::IntVec2::Type);
        } /// end of namespace IntVec2

        namespace IntVec3
        {
            typedef ::Whms::Property::Base::IntVec3::Type Type;
            WIZ_DECLARE(::Whms::Property::IntVec3::Type);
        } /// end of namespace IntVec3

        namespace IntVec4
        {
            typedef ::Whms::Property::Base::IntVec4::Type Type;
            WIZ_DECLARE(::Whms::Property::IntVec4::Type);
        } /// end of namespace IntVec4

        //////////////////////////////////////////////////////////////////////////
        //////////////////////////////////////////////////////////////////////////
        //////////////////////////////////////////////////////////////////////////

    } /// end of namespace Property

} /// end of namespace Whms

#define WHMS_PROPERTY_DEFINE_ITEM(n, m)                                                 \
    namespace n                                                                         \
    {                                                                                   \
        typedef ::Whms::Property::##m##::Type<::Whms::Property::##n##::Type>   Type;    \
    }

#define WHMS_PROPERTIES_DEFINE(m)           \
    WHMS_PROPERTY_DEFINE_ITEM(Int8, m)      \
    WHMS_PROPERTY_DEFINE_ITEM(Int16, m)     \
    WHMS_PROPERTY_DEFINE_ITEM(Int32, m)     \
    WHMS_PROPERTY_DEFINE_ITEM(Int64, m)     \
    WHMS_PROPERTY_DEFINE_ITEM(UInt8, m)     \
    WHMS_PROPERTY_DEFINE_ITEM(UInt16, m)    \
    WHMS_PROPERTY_DEFINE_ITEM(UInt32, m)    \
    WHMS_PROPERTY_DEFINE_ITEM(UInt64, m)    \
    WHMS_PROPERTY_DEFINE_ITEM(Real32, m)    \
    WHMS_PROPERTY_DEFINE_ITEM(Real64, m)    \
    WHMS_PROPERTY_DEFINE_ITEM(Vec2, m)      \
    WHMS_PROPERTY_DEFINE_ITEM(Vec3, m)      \
    WHMS_PROPERTY_DEFINE_ITEM(Vec4, m)      \
    WHMS_PROPERTY_DEFINE_ITEM(IntVec2, m)   \
    WHMS_PROPERTY_DEFINE_ITEM(IntVec3, m)   \
    WHMS_PROPERTY_DEFINE_ITEM(IntVec4, m)


#endif /*__WHIMSY_PROPERTY_HPP__SHANHAOBO_19800429__*/
